package root.RoundRobinScheduling;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 实现了轮转调度算法，包含一个进程队列 queue 来存储待执行的进程，timeQuantum 为时间片大小。
 */
public class RoundRobinScheduler {

    private Queue<Process> queue;  // 进程队列
    private int timeQuantum;       // 时间片大小

    public RoundRobinScheduler(int timeQuantum) {
        this.timeQuantum = timeQuantum;
        this.queue = new LinkedList<>();
    }

    public void addProcess(Process process) {
        queue.add(process);
    }

    public void run() {
        while (!queue.isEmpty()) {
            Process process = queue.poll();  // 获取队列中的进程
            System.out.println("Process " + process.id + " is executing.");

            // 判断进程是否能在当前时间片内完成
            if (process.remainingTime > timeQuantum) {
                process.remainingTime -= timeQuantum;  // 执行时间片大小
                System.out.println("Process " + process.id + " executed for " + timeQuantum + " units. Remaining time: " + process.remainingTime);
                queue.add(process);  // 执行不完，重新加入队列
            } else {
                System.out.println("Process " + process.id + " finished execution.");
                process.remainingTime = 0;  // 进程执行完毕
            }
        }
    }

    public static void main(String[] args) {
        RoundRobinScheduler scheduler = new RoundRobinScheduler(4);  // 时间片设置为 4

        // 添加进程
        scheduler.addProcess(new Process(1, 10));
        scheduler.addProcess(new Process(2, 5));
        scheduler.addProcess(new Process(3, 8));

        // 执行调度
        scheduler.run();
    }
}
/**
 * 轮转调度（Round-Robin Scheduling）是一种常用的 CPU 调度算法，在该算法中，每个进程被分配一个固定的时间片（时间量），进程在执行完自己的时间片后，如果没有完成任务，就会被放回队列的末尾，等待下次执行。这种方式确保了系统中所有进程都能公平地使用 CPU。
 *
 * 轮转调度算法的步骤：
 * 按顺序分配 CPU 给每个进程。
 * 每个进程只能使用 CPU 一定的时间片，如果进程执行完毕则从队列中移除，否则继续等待。
 * 每个进程最多使用时间片大小的时间，执行完后被移动到队列的尾部。
 */